<!DOCTYPE html>
<html>
<head>
    <title>Hello React</title>
    <!-- Not present in the tutorial. Just for basic styling. -->
    <!--<link rel="stylesheet" href="public/css/base.css"/>-->
    <script src="http://cdn.cdnjs.net/react/0.13.0/react.min.js"></script>
    <script src="http://cdn.cdnjs.net/react/0.13.0/JSXTransformer.js"></script>
    <script src="http://cdn.cdnjs.net/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://libs.cdnjs.net/showdown/0.3.1/showdown.min.js"></script>

</head>
<body>
<div id="content"></div>
<script type="text/jsx">
    //    var data=[
    //        {
    //            author:"Pete Hunt",
    //            text:"this is one comment"
    //        },
    //        {
    //            author:"Jordan Walke",
    //            text:"this is *another* comment"
    //        }
    //    ];
    var CommentBox = React.createClass({
        loadCommentsFromServer: function() {
            $.ajax({
                url: this.props.url,
                dataType: 'json',
                success: function(data) {
                    this.setState({data: data});
                }.bind(this),
                error: function(xhr, status, err) {
                    console.error(this.props.url, status, err.toString());
                }.bind(this)
            });
        },
        handleCommentSubmit: function(comment) {
            var comments = this.state.data;
            var newComments = comments.concat([comment]);
            this.setState({data: newComments});
            $.ajax({
                url: this.props.url,
                dataType: 'json',
                type: 'POST',
                data: comment,
                success: function(data) {
                    this.setState({data: data});
                }.bind(this),
                error: function(xhr, status, err) {
                    console.error(this.props.url, status, err.toString());
                }.bind(this)
            });
        },
        getInitialState: function() {
            return {data: []};
        },
        componentDidMount: function() {
            this.loadCommentsFromServer();
            setInterval(this.loadCommentsFromServer, this.props.pollInterval);
        },
        render: function() {
            return (
                    <div className="commentBox">
                        <h1>Comments</h1>
                        <CommentList data={this.state.data} />
                        <CommentForm onCommentSubmit={this.handleCommentSubmit} />
                    </div>
            );
        }
    });

    React.render(
            <CommentBox url="comments.json" pollInteral="{2000}"/>,
            document.getElementById('content')
    );

    var CommentList = React.createClass({
        render: function () {
            var commentNodes = this.props.data.map(function (comment) {
                return (
                        <Comment author={comment.author}>
                            {comment.text}
                        </Comment>
                );
            });
            return (
                    <div className="commentList">
                        {commentNodes}
                    </div>
            );
        },
    });
    var converter = new Showdown.converter();

    var Comment = React.createClass({
        render: function () {
            var rawMarkup = converter.makeHtml(this.props.children.toString());
            return (
                    <div className="commentForm">
                        <h2 className="commentAuthor">
                            {this.props.author}
                        </h2>
                        <span dangerouslySetInnerHTML={{"{{"}}__html : rawMarkup}}/>
                    </div>
            );
        }
    });

    var CommentForm = React.createClass({
        handleSubmit: function (e) {
            e.preventDefault();
            var author = this.refs.author.getDOMNode().value.trim();
            var text = this.refs.text.getDOMNode().value.trim();
            if (!text || !author) {
                return;
            }
            this.props.onCommentSubmit({author: author, text: text});
            this.refs.author.getDOMNode().value = '';
            this.refs.text.getDOMNode().value = '';
            return;
        },
        render: function () {
            return (
                    <form className="commentForm" onSubmit={this.handleSubmit}>
                        <input type="text" placeholder="Your name" ref="author"/>
                        <input type="text" placeholder="Say something..." ref="text"/>
                        <input type="submit" value="Post"/>
                    </form>
            );
        }
    });

</script>
</body>
</html>
